/*
 * Copyright (C) 2005 - 2013 MaNGOS <http://www.getmangos.com/>
 *
 * Copyright (C) 2008 - 2013 Trinity <http://www.trinitycore.org/>
 *
 * Copyright (C) 2006 - 2013 ScriptDev2 <http://www.scriptdev2.com/>
 *
 * Copyright (C) 2010 - 2013 ProjectSkyfire <http://www.projectskyfire.org/>
 *
 * Copyright (C) 2011 - 2013 ArkCORE <http://www.arkania.net/>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 */

#include "ScriptPCH.h"
#include "ScriptedEscortAI.h"

#define LESS_MOB // if you do not have a good server and do not want it to be laggy as hell
//Light of Dawn
enum mograine {
#ifdef LESS_MOB
    ENCOUNTER_DK_NUMBER = 5, // how many player queue to start the quest , or -
    ENCOUNTER_DK_TIMER = 10, // *every 5 minutes. These have to be done in instance data
    ENCOUNTER_DEFENDER_NUMBER = 10, // how many of defender
    ENCOUNTER_EARTHSHATTER_NUMBER = 1, // how many of earthshatter
    ENCOUNTER_ABOMINATION_NUMBER = 2, // how many of abomination
    ENCOUNTER_BEHEMOTH_NUMBER = 1, // how many of behemoth
    ENCOUNTER_GHOUL_NUMBER = 5, // how many of ghoul
    ENCOUNTER_WARRIOR_NUMBER = 1, // how many of warrior
#else
    ENCOUNTER_DK_NUMBER = 5, // how many player queue to start the quest , or -
    ENCOUNTER_DK_TIMER = 10, // *every 5 minutes. These have to be done in instance data
    ENCOUNTER_DEFENDER_NUMBER = 20, // how many of defender
    ENCOUNTER_EARTHSHATTER_NUMBER = 20, // how many of earthshatter
    ENCOUNTER_ABOMINATION_NUMBER = 3, // how many of abomination
    ENCOUNTER_BEHEMOTH_NUMBER = 2, // how many of behemoth
    ENCOUNTER_GHOUL_NUMBER = 10, // how many of ghoul
    ENCOUNTER_WARRIOR_NUMBER = 2, // how many of warrior
#endif
    ENCOUNTER_TOTAL_DAWN = 300, // Total number
    ENCOUNTER_TOTAL_SCOURGE = 10000,

    WORLD_STATE_REMAINS = 3592,
    WORLD_STATE_COUNTDOWN = 3603,
    WORLD_STATE_EVENT_BEGIN = 3605,

    SAY_LIGHT_OF_DAWN01 = -1609201, // pre text
    SAY_LIGHT_OF_DAWN02 = -1609202,
    SAY_LIGHT_OF_DAWN03 = -1609203,
    SAY_LIGHT_OF_DAWN04 = -1609204, // intro
    SAY_LIGHT_OF_DAWN05 = -1609205,
    SAY_LIGHT_OF_DAWN06 = -1609206,
    SAY_LIGHT_OF_DAWN07 = -1609207, // During the fight - Korfax, Champion of the Light
    SAY_LIGHT_OF_DAWN08 = -1609208, // Lord Maxwell Tyrosus
    SAY_LIGHT_OF_DAWN09 = -1609209, // Highlord Darion Mograine
    SAY_LIGHT_OF_DAWN10 = -1609210,
    SAY_LIGHT_OF_DAWN11 = -1609211,
    SAY_LIGHT_OF_DAWN12 = -1609212,
    SAY_LIGHT_OF_DAWN13 = -1609213,
    SAY_LIGHT_OF_DAWN14 = -1609214,
    SAY_LIGHT_OF_DAWN15 = -1609215,
    SAY_LIGHT_OF_DAWN16 = -1609216,
    SAY_LIGHT_OF_DAWN17 = -1609217,
    SAY_LIGHT_OF_DAWN18 = -1609218,
    SAY_LIGHT_OF_DAWN19 = -1609219,
    SAY_LIGHT_OF_DAWN20 = -1609220,
    SAY_LIGHT_OF_DAWN21 = -1609221,
    SAY_LIGHT_OF_DAWN22 = -1609222,
    SAY_LIGHT_OF_DAWN23 = -1609223,
    SAY_LIGHT_OF_DAWN24 = -1609224,
    SAY_LIGHT_OF_DAWN25 = -1609225, // After the fight
    SAY_LIGHT_OF_DAWN26 = -1609226, // Highlord Tirion Fordring
    SAY_LIGHT_OF_DAWN27 = -1609227, // Highlord Darion Mograine
    SAY_LIGHT_OF_DAWN28 = -1609228, // Highlord Tirion Fordring
    SAY_LIGHT_OF_DAWN29 = -1609229, // Highlord Tirion Fordring
    SAY_LIGHT_OF_DAWN30 = -1609230, // Highlord Tirion Fordring
    SAY_LIGHT_OF_DAWN31 = -1609231, // Highlord Tirion Fordring
    SAY_LIGHT_OF_DAWN32 = -1609232, // Highlord Alexandros Mograine
    SAY_LIGHT_OF_DAWN33 = -1609233, // Highlord Darion Mograine
    SAY_LIGHT_OF_DAWN34 = -1609234, // Highlord Darion Mograine
    SAY_LIGHT_OF_DAWN35 = -1609235, // Darion Mograine
    SAY_LIGHT_OF_DAWN36 = -1609236, // Darion Mograine
    SAY_LIGHT_OF_DAWN37 = -1609237, // Highlord Alexandros Mograine
    SAY_LIGHT_OF_DAWN38 = -1609238, // Darion Mograine
    SAY_LIGHT_OF_DAWN39 = -1609239, // Highlord Alexandros Mograine
    SAY_LIGHT_OF_DAWN40 = -1609240, // Darion Mograine
    SAY_LIGHT_OF_DAWN41 = -1609241, // Highlord Alexandros Mograine
    SAY_LIGHT_OF_DAWN42 = -1609242, // Highlord Alexandros Mograine
    SAY_LIGHT_OF_DAWN43 = -1609243, // The Lich King
    SAY_LIGHT_OF_DAWN44 = -1609244, // Highlord Darion Mograine
    SAY_LIGHT_OF_DAWN45 = -1609245, // The Lich King
    SAY_LIGHT_OF_DAWN46 = -1609246, // The Lich King
    SAY_LIGHT_OF_DAWN47 = -1609247, // Highlord Tirion Fordring
    SAY_LIGHT_OF_DAWN48 = -1609248, // The Lich King
    SAY_LIGHT_OF_DAWN49 = -1609249, // The Lich King
    SAY_LIGHT_OF_DAWN50 = -1609250, // Lord Maxwell Tyrosus
    SAY_LIGHT_OF_DAWN51 = -1609251, // The Lich King
    SAY_LIGHT_OF_DAWN52 = -1609252, // Highlord Darion Mograine
    SAY_LIGHT_OF_DAWN53 = -1609253, // Highlord Darion Mograine
    SAY_LIGHT_OF_DAWN54 = -1609254, // Highlord Tirion Fordring
    SAY_LIGHT_OF_DAWN55 = -1609255, // The Lich King
    SAY_LIGHT_OF_DAWN56 = -1609256, // Highlord Tirion Fordring
    SAY_LIGHT_OF_DAWN57 = -1609257, // The Lich King
    SAY_LIGHT_OF_DAWN58 = -1609258, // The Lich King
    SAY_LIGHT_OF_DAWN59 = -1609259, // The Lich King
    SAY_LIGHT_OF_DAWN60 = -1609260, // Highlord Tirion Fordring
    SAY_LIGHT_OF_DAWN61 = -1609261, // Highlord Tirion Fordring
    SAY_LIGHT_OF_DAWN62 = -1609262, // Highlord Tirion Fordring
    SAY_LIGHT_OF_DAWN63 = -1609263, // Highlord Tirion Fordring
    SAY_LIGHT_OF_DAWN64 = -1609264, // Highlord Tirion Fordring
    SAY_LIGHT_OF_DAWN65 = -1609265, // Highlord Tirion Fordring
    SAY_LIGHT_OF_DAWN66 = -1609266, // Highlord Tirion Fordring
    SAY_LIGHT_OF_DAWN67 = -1609267, // Highlord Tirion Fordring
    SAY_LIGHT_OF_DAWN68 = -1609268, // Highlord Darion Mograine

    EMOTE_LIGHT_OF_DAWN01 = -1609269, // Emotes
    EMOTE_LIGHT_OF_DAWN02 = -1609270,
    EMOTE_LIGHT_OF_DAWN03 = -1609271,
    EMOTE_LIGHT_OF_DAWN04 = -1609272,
    EMOTE_LIGHT_OF_DAWN05 = -1609273,
    EMOTE_LIGHT_OF_DAWN06 = -1609274,
    EMOTE_LIGHT_OF_DAWN07 = -1609275,
    EMOTE_LIGHT_OF_DAWN08 = -1609276,
    EMOTE_LIGHT_OF_DAWN09 = -1609277,
    EMOTE_LIGHT_OF_DAWN10 = -1609278,
    EMOTE_LIGHT_OF_DAWN11 = -1609279,
    EMOTE_LIGHT_OF_DAWN12 = -1609280,
    EMOTE_LIGHT_OF_DAWN13 = -1609281,
    EMOTE_LIGHT_OF_DAWN14 = -1609282,
    EMOTE_LIGHT_OF_DAWN15 = -1609283,
    EMOTE_LIGHT_OF_DAWN16 = -1609284,
    EMOTE_LIGHT_OF_DAWN17 = -1609285,
    EMOTE_LIGHT_OF_DAWN18 = -1609286,

    GO_LIGHT_OF_DAWN = 191330,
    SPELL_THE_LIGHT_OF_DAWN_Q = 53606, // quest credit

    // ---- Dark Knight npc --------------------
    // Highlord Darion Mograine
    NPC_HIGHLORD_DARION_MOGRAINE = 29173,
    SPELL_ANTI_MAGIC_ZONE1 = 52893,
    SPELL_DEATH_STRIKE = 53639,
    SPELL_DEATH_EMBRACE = 53635,
    SPELL_ICY_TOUCH1 = 49723,
    SPELL_THE_LIGHT_OF_DAWN = 53658,
    SPELL_THE_MIGHT_OF_MOGRAINE = 53642, // on players when begins
    SPELL_UNHOLY_BLIGHT = 53640,
    SPELL_ALEXANDROS_MOGRAINE_SPAWN = 53667,
    SPELL_MOGRAINE_CHARGE = 53679,
    SPELL_ASHBRINGER = 53701,

    // Koltira Deathweaver & Orbaz Bloodbane are using the same abilities
    NPC_KOLTIRA_DEATHWEAVER = 29199,
    NPC_ORBAZ_BLOODBANE = 29204, // this guy fleed
    NPC_THASSARIAN = 29200, // he also does SPELL_THE_LIGHT_OF_DAWN 53658
    SPELL_BLOOD_STRIKE1 = 52374,
    SPELL_DEATH_GRIP = 49576,
    SPELL_ICY_TOUCH2 = 52372,
    SPELL_PLAGUE_STRIKE1 = 50668,
    // all do SPELL_HERO_AGGRO_AURA    53627

    // Lich King
    NPC_THE_LICH_KING = 29183, // show up at end
    SPELL_APOCALYPSE = 53210,
    SPELL_TELEPORT_VISUAL = 52233,
    SPELL_SOUL_FEAST_ALEX = 53677, // on Alexandros
    SPELL_SOUL_FEAST_TIRION = 53685, // on Tirion
    SPELL_ICEBOUND_VISAGE = 53274, // not sure what is it for
    SPELL_REBUKE = 53680,

    // others
    NPC_RAMPAGING_ABOMINATION = 29186,
    SPELL_CLEAVE1 = 53633,
    SPELL_SCOURGE_HOOK = 50335,
    SPELL_SCOURGE_AGGRO_AURA = 53624,

    NPC_FLESH_BEHEMOTH = 29190, // giant guy
    SPELL_STOMP = 53634,
    SPELL_THUNDERCLAP = 36706,
    SPELL_HERO_AGGRO_AURA = 53627,

    NPC_ACHERUS_GHOUL = 29219, // just ghoul....
    SPELL_GHOULPLOSION = 53632,

    NPC_WARRIOR_OF_THE_FROZEN_WASTES = 29206, // use SPELL_CLEAVE 53631

    NPC_HIGHLORD_ALEXANDROS_MOGRAINE = 29227, // ghost
    NPC_DARION_MOGRAINE = 29228, // ghost

    // ---- Dawn npc --------------------
    // Highlord Tirion Fordring
    NPC_HIGHLORD_TIRION_FORDRING = 29175,
    EQUIP_HIGHLORD_TIRION_FORDRING = 13262,
    SPELL_LAY_ON_HANDS = 53778,
    SPELL_REBIRTH_OF_THE_ASHBRINGER = 53702,
    SPELL_TIRION_CHARGE = 53705,
    SPELL_TIRION_CHARGE_VISUAL = 53706,

    // others
    NPC_KORFAX_CHAMPION_OF_THE_LIGHT = 29176,
    SPELL_CLEAVE = 53631,
    SPELL_HEROIC_LEAP = 53625,

    NPC_LORD_MAXWELL_TYROSUS = 29178,
    NPC_LEONID_BARTHALOMEW_THE_REVERED = 29179,
    NPC_DUKE_NICHOLAS_ZVERENHOFF = 29180,

    NPC_COMMANDER_ELIGOR_DAWNBRINGER = 29177,
    SPELL_HOLY_LIGHT2 = 37979,

    NPC_RAYNE = 29181,
    SPELL_REJUVENATION = 20664,
    SPELL_STARFALL = 20678,
    SPELL_TRANQUILITY = 25817,
    SPELL_WRATH = 21807,

    NPC_DEFENDER_OF_THE_LIGHT = 29174, // also does SPELL_HEROIC_LEAP 53625
    SPELL_HOLY_LIGHT1 = 29427,
    SPELL_HOLY_STRIKE = 53643,
    SPELL_HOLY_WRATH = 53638,
    SPELL_UPPERCUT = 53629,

    NPC_RIMBLAT_EARTHSHATTER = 29182,
    SPELL_CHAIN_HEAL = 33642,
    SPELL_THUNDER = 53630
};

struct Location {
    float x, y, z, o;
};

void UpdateWorldState(Map *map, uint32 id, uint32 state) {
    Map::PlayerList const& players = map->GetPlayers();

    if (!players.isEmpty()) {
        for (Map::PlayerList::const_iterator itr = players.begin();
                itr != players.end(); ++itr) {
            if (Player* pPlayer = itr->getSource())
                pPlayer->SendUpdateWorldState(id, state);
        }
    }
}

static Location LightofDawnLoc[] = { { 2281.335f, -5300.409f, 85.170f, 0 }, // 0 Tirion Fordring loc
        { 2283.896f, -5287.914f, 83.066f, 1.55f }, // 1 Tirion Fordring loc2
        { 2281.461f, -5263.014f, 81.164f, 0 }, // 2 Tirion charges
        { 2262.277f, -5293.477f, 82.167f, 0 }, // 3 Tirion run
        { 2270.286f, -5287.73f, 82.262f, 0 }, // 4 Tirion relocate
        { 2269.511f, -5288.289f, 82.225f, 0 }, // 5 Tirion forward
        { 2262.277f, -5293.477f, 82.167f, 0 }, // 6 Tirion runs to Darion
        { 2270.286f, -5287.73f, 82.262f, 0 }, { 2269.511f, -5288.289f, 82.225f,
                0 }, { 2273.205f, -5288.848f, 82.617f, 0 }, // 9 Korfax loc1
        { 2274.739f, -5287.926f, 82.684f, 0 }, // 10 Korfax loc2
        { 2253.673f, -5318.004f, 81.724f, 0 }, // 11 Korfax kicked
        { 2287.028f, -5309.644f, 87.253f, 0 }, // 12 Maxwell loc1
        { 2286.978f, -5308.025f, 86.83f, 0 }, // 13 Maxwell loc2
        { 2248.877f, -5307.586f, 82.166f, 0 }, // 14 maxwell kicked
        { 2278.58f, -5316.933f, 88.319f, 0 }, // 15 Eligor loc1
        { 2278.535f, -5315.479f, 88.08f, 0 }, // 16 Eligor loc2
        { 2259.416f, -5304.505f, 82.149f, 0 }, // 17 eligor kicked
        { 2289.259f, -5280.355f, 82.112f, 0 }, // 18 Koltira loc1
        { 2289.02f, -5281.985f, 82.207f, 0 }, // 19 Koltira loc2
        { 2273.289f, -5273.675f, 81.701f, 0 }, // 20 Thassarian loc1
        { 2273.332f, -5275.544f, 81.849f, 0 }, // 21 Thassarian loc2
        { 2281.198f, -5257.397f, 80.224f, 4.66f }, // 22 Alexandros loc1
        { 2281.156f, -5259.934f, 80.647f, 0 }, // 23 Alexandros loc2
        { 2281.294f, -5281.895f, 82.445f, 1.35f }, // 24 Darion loc1
        { 2281.093f, -5263.013f, 81.125f, 0 }, // 25 Darion loc1
        { 2281.313f, -5250.282f, 79.322f, 4.69f }, // 26 Lich King spawns
        { 2281.523f, -5261.058f, 80.877f, 0 }, // 27 Lich king move forwards
        { 2272.709f, -5255.552f, 78.226f, 0 }, // 28 Lich king kicked
        { 2273.972f, -5257.676f, 78.862f, 0 }, // 29 Lich king moves forward
        };

class npc_highlord_darion_mograine: public CreatureScript {
public:
    npc_highlord_darion_mograine() :
            CreatureScript("npc_highlord_darion_mograine") {
    }

    bool OnGossipSelect(Player* pPlayer, Creature* pCreature,
            uint32 /*uiSender*/, uint32 uiAction) {
        pPlayer->PlayerTalkClass->ClearMenus();
        switch (uiAction) {
        case GOSSIP_ACTION_INFO_DEF + 1:
            pPlayer->CLOSE_GOSSIP_MENU();
            CAST_AI(npc_highlord_darion_mograine::npc_highlord_darion_mograineAI, pCreature->AI())->uiStep =
                    1;
            CAST_AI(npc_highlord_darion_mograine::npc_highlord_darion_mograineAI, pCreature->AI())->Start(
                    true, false, pPlayer->GetGUID());
            break;
        }
        return true;
    }

    bool OnGossipHello(Player* pPlayer, Creature* pCreature) {
        if (pCreature->isQuestGiver())
            pPlayer->PrepareQuestMenu(pCreature->GetGUID());

        if (pPlayer->GetQuestStatus(12801) == QUEST_STATUS_INCOMPLETE)
            pPlayer->ADD_GOSSIP_ITEM(0, "I am ready.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);

        pPlayer->SEND_GOSSIP_MENU(pPlayer->GetGossipTextId(pCreature), pCreature->GetGUID());

        return true;
    }

    CreatureAI* GetAI(Creature* pCreature) const {
        return new npc_highlord_darion_mograineAI(pCreature);
    }

    struct npc_highlord_darion_mograineAI: public npc_escortAI {
        npc_highlord_darion_mograineAI(Creature *pCreature) :
                npc_escortAI(pCreature) {
            Reset();
        }

        bool bIsBattle;
        uint32 uiStep;
        uint32 uiPhase_timer;
        uint32 uiFight_duration;
        uint32 uiTotal_dawn;
        uint32 uiTotal_scourge;
        uint32 uiSummon_counter;

        // Darion Mograine
        uint32 uiAnti_magic_zone;
        uint32 uiDeath_strike;
        uint32 uiDeath_embrace;
        uint32 uiIcy_touch;
        uint32 uiUnholy_blight;
        uint32 uiFight_speech;
        uint32 uiSpawncheck;
        uint32 uiTargetcheck;

        // Dawn
        uint64 uiTirionGUID;
        uint64 uiAlexandrosGUID;
        uint64 uiDarionGUID;
        uint64 uiKorfaxGUID;
        uint64 uiMaxwellGUID;
        uint64 uiEligorGUID;
        uint64 uiRayneGUID;
        uint64 uiDefenderGUID[ENCOUNTER_DEFENDER_NUMBER];
        uint64 uiEarthshatterGUID[ENCOUNTER_EARTHSHATTER_NUMBER];

        // Death
        uint64 uiKoltiraGUID;
        uint64 uiOrbazGUID;
        uint64 uiThassarianGUID;
        uint64 uiLichKingGUID;
        uint64 uiAbominationGUID[ENCOUNTER_ABOMINATION_NUMBER];
        uint64 uiBehemothGUID[ENCOUNTER_BEHEMOTH_NUMBER];
        uint64 uiGhoulGUID[ENCOUNTER_GHOUL_NUMBER];
        uint64 uiWarriorGUID[ENCOUNTER_WARRIOR_NUMBER];

        void Reset() {
            if (!HasEscortState(STATE_ESCORT_ESCORTING)) {
                bIsBattle = false;
                uiStep = 0;
                uiPhase_timer = 3000;
                uiFight_duration = 300000; // 5 minutes
                uiTotal_dawn = ENCOUNTER_TOTAL_DAWN;
                uiTotal_scourge = ENCOUNTER_TOTAL_SCOURGE;
                uiSummon_counter = 0;

                uiAnti_magic_zone = urand(1000, 6000);
                uiDeath_strike = urand(5000, 10000);
                uiDeath_embrace = urand(5000, 10000);
                uiIcy_touch = urand(5000, 10000);
                uiUnholy_blight = urand(5000, 10000);

                uiFight_speech = 15000;
                uiSpawncheck = 1000;
                uiTargetcheck = 10000;

                me->SetStandState(UNIT_STAND_STATE_STAND);
                me->Mount(25279);
                me->SetVisible(true);

                UpdateWorldState(me->GetMap(), WORLD_STATE_REMAINS, 0);
                //UpdateWorldState(me->GetMap(), WORLD_STATE_COUNTDOWN, 0);
                UpdateWorldState(me->GetMap(), WORLD_STATE_EVENT_BEGIN, 0);

                if (Creature* pTemp = Unit::GetCreature(*me, uiTirionGUID))
                    pTemp->setDeathState(JUST_DIED);
                if (Creature* pTemp = Unit::GetCreature(*me, uiKorfaxGUID))
                    pTemp->setDeathState(JUST_DIED);
                if (Creature* pTemp = Unit::GetCreature(*me, uiMaxwellGUID))
                    pTemp->setDeathState(JUST_DIED);
                if (Creature* pTemp = Unit::GetCreature(*me, uiEligorGUID))
                    pTemp->setDeathState(JUST_DIED);
                if (Creature* pTemp = Unit::GetCreature(*me, uiRayneGUID))
                    pTemp->setDeathState(JUST_DIED);

                uiTirionGUID = NULL;
                uiKorfaxGUID = NULL;
                uiMaxwellGUID = NULL;
                uiEligorGUID = NULL;
                uiRayneGUID = NULL;

                for (uint8 i = 0; i < ENCOUNTER_DEFENDER_NUMBER; ++i) {
                    if (Creature* pTemp = Unit::GetCreature(*me, uiDefenderGUID[i]))
                        pTemp->setDeathState(JUST_DIED);
                    uiDefenderGUID[i] = 0;
                }
                for (uint8 i = 0; i < ENCOUNTER_EARTHSHATTER_NUMBER; ++i) {
                    if (Creature* pTemp = Unit::GetCreature(*me, uiEarthshatterGUID[i]))
                        pTemp->setDeathState(JUST_DIED);
                    uiEarthshatterGUID[i] = 0;
                }

                if (Creature* pTemp = Unit::GetCreature(*me, uiKoltiraGUID))
                    pTemp->Respawn();
                if (Creature* pTemp = Unit::GetCreature(*me, uiOrbazGUID))
                    pTemp->Respawn();
                if (Creature* pTemp = Unit::GetCreature(*me, uiThassarianGUID))
                    pTemp->Respawn();
                if (Creature* pTemp = Unit::GetCreature(*me, uiLichKingGUID))
                    pTemp->Respawn();

                uiKoltiraGUID = NULL;
                uiOrbazGUID = NULL;
                uiThassarianGUID = NULL;
                uiLichKingGUID = NULL;
                for (uint8 i = 0; i < ENCOUNTER_ABOMINATION_NUMBER; ++i) {
                    if (Creature* pTemp = Unit::GetCreature(*me, uiAbominationGUID[i]))
                        pTemp->setDeathState(JUST_DIED);
                    uiAbominationGUID[i] = 0;
                }
                for (uint8 i = 0; i < ENCOUNTER_BEHEMOTH_NUMBER; ++i) {
                    if (Creature* pTemp = Unit::GetCreature(*me, uiBehemothGUID[i]))
                        pTemp->setDeathState(JUST_DIED);
                    uiBehemothGUID[i] = 0;
                }
                for (uint8 i = 0; i < ENCOUNTER_GHOUL_NUMBER; ++i) {
                    if (Creature* pTemp = Unit::GetCreature(*me, uiGhoulGUID[i]))
                        pTemp->setDeathState(JUST_DIED);
                    uiGhoulGUID[i] = 0;
                }
                for (uint8 i = 0; i < ENCOUNTER_WARRIOR_NUMBER; ++i) {
                    if (Creature* pTemp = Unit::GetCreature(*me, uiWarriorGUID[i]))
                        pTemp->setDeathState(JUST_DIED);
                    uiWarriorGUID[i] = 0;
                }
            }
        }

        void AttackStart(Unit* who) {
            if (!who)
                return;

            if (who == me)
                return;

            if (me->Attack(who, true)) {
                me->AddThreat(who, 0.0f);
                me->SetInCombatWith(who);
                who->SetInCombatWith(me);
                DoStartMovement(who);
            }
        }

        void MoveInLineOfSight(Unit* who) {
            if (!who)
                return;

            if (who->isTargetableForAttack() && me->IsHostileTo(who))
                if (me->IsWithinDistInMap(who, 20) && me->IsWithinLOSInMap(who))
                    AttackStart(who);
        }

        void SetHoldState(bool bOnHold) {
            SetEscortPaused(bOnHold);
        }

        void WaypointReached(uint32 i) {
            switch (i) {
            case 0:
                me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);
                SetHoldState(true);
                break;
            case 1:
                SetHoldState(true);

                SpawnNPC();
                if (Creature* pTemp = Unit::GetCreature(*me, uiKorfaxGUID))
                    DoScriptText(SAY_LIGHT_OF_DAWN07, pTemp);
                if (Creature* pTemp = Unit::GetCreature(*me, uiMaxwellGUID))
                    DoScriptText(SAY_LIGHT_OF_DAWN08, pTemp);

                for (uint8 i = 0; i < ENCOUNTER_GHOUL_NUMBER; ++i)
                    NPCChangeTarget(uiGhoulGUID[i]);
                for (uint8 i = 0; i < ENCOUNTER_WARRIOR_NUMBER; ++i)
                    NPCChangeTarget(uiWarriorGUID[i]);
                for (uint8 i = 0; i < ENCOUNTER_ABOMINATION_NUMBER; ++i)
                    NPCChangeTarget(uiAbominationGUID[i]);
                for (uint8 i = 0; i < ENCOUNTER_BEHEMOTH_NUMBER; ++i)
                    NPCChangeTarget(uiBehemothGUID[i]);
                NPCChangeTarget(uiKoltiraGUID);
                NPCChangeTarget(uiOrbazGUID);
                NPCChangeTarget(uiThassarianGUID);

                me->Unmount();
                me->CastSpell(me, SPELL_THE_MIGHT_OF_MOGRAINE, true); // need to fix, on player only

                if (Creature* pTemp = Unit::GetCreature(*me, uiKoltiraGUID))
                    pTemp->Unmount();
                if (Creature* pTemp = Unit::GetCreature(*me, uiThassarianGUID))
                    pTemp->Unmount();

                bIsBattle = true;
                break;
            case 2:
                me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING);
                DoCast(me, SPELL_THE_LIGHT_OF_DAWN);
                break;
            case 3: {
                //Unit* pTirion = Unit::GetCreature(*me, uiTirionGUID);

                DoScriptText(EMOTE_LIGHT_OF_DAWN05, me);
                if (me->HasAura(SPELL_THE_LIGHT_OF_DAWN, 0))
                    me->RemoveAurasDueToSpell(SPELL_THE_LIGHT_OF_DAWN);
                if (Creature* pTemp = Unit::GetCreature(*me, uiKoltiraGUID)) {
                    if (pTemp->HasAura(SPELL_THE_LIGHT_OF_DAWN, 0))
                        pTemp->RemoveAurasDueToSpell(SPELL_THE_LIGHT_OF_DAWN);
                    pTemp->AddUnitMovementFlag(MOVEMENTFLAG_WALKING);
                    pTemp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[19].x,
                            LightofDawnLoc[19].y, LightofDawnLoc[19].z);
                }
                if (Creature* pTemp = Unit::GetCreature(*me, uiThassarianGUID)) {
                    if (pTemp->HasAura(SPELL_THE_LIGHT_OF_DAWN, 0))
                        pTemp->RemoveAurasDueToSpell(SPELL_THE_LIGHT_OF_DAWN);
                    pTemp->AddUnitMovementFlag(MOVEMENTFLAG_WALKING);
                    pTemp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[21].x,
                            LightofDawnLoc[21].y, LightofDawnLoc[21].z);
                }
                if (Creature* pTemp = Unit::GetCreature(*me, uiKorfaxGUID)) {
                    pTemp->AddUnitMovementFlag(MOVEMENTFLAG_WALKING);
                    pTemp->SetUInt32Value(UNIT_NPC_EMOTESTATE,
                            EMOTE_STATE_READY2H);
                    pTemp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[10].x,
                            LightofDawnLoc[10].y, LightofDawnLoc[10].z);
                }
                if (Creature* pTemp = Unit::GetCreature(*me, uiMaxwellGUID)) {
                    pTemp->AddUnitMovementFlag(MOVEMENTFLAG_WALKING);
                    pTemp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[13].x,
                            LightofDawnLoc[13].y, LightofDawnLoc[13].z);
                }
                if (Creature* pTemp = Unit::GetCreature(*me, uiEligorGUID)) {
                    pTemp->AddUnitMovementFlag(MOVEMENTFLAG_WALKING);
                    pTemp->GetMotionMaster()->MovePoint(0, LightofDawnLoc[16].x,
                            LightofDawnLoc[16].y, LightofDawnLoc[16].z);
                }
                JumpToNextStep(10000);
            }
                break;
            case 4:
                DoScriptText(SAY_LIGHT_OF_DAWN27, me);
                me->SetStandState(UNIT_STAND_STATE_KNEEL);

                if (Creature* pTemp = Unit::GetCreature(*me, uiKoltiraGUID))
                    pTemp->SetStandState(UNIT_STAND_STATE_KNEEL);
                if (Creature* pTemp = Unit::GetCreature(*me, uiThassarianGUID))
                    pTemp->SetStandState(UNIT_STAND_STATE_KNEEL);
                SetHoldState(true);
                break;
            case 5:
                DoScriptText(SAY_LIGHT_OF_DAWN33, me);
                SetHoldState(true);
                break;
            case 6:
                SetHoldState(true);
                me->HandleEmoteCommand(EMOTE_ONESHOT_SPECIALATTACK1H);
                JumpToNextStep(1000);
                break;
            case 7:
                SetHoldState(true);
                JumpToNextStep(2000);
                break;
            case 8:
                me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0,
                        uint32(EQUIP_UNEQUIP));
                if (Creature* pTemp = Unit::GetCreature(*me, uiTirionGUID))
                    me->CastSpell(pTemp, SPELL_ASHBRINGER, true);
                DoScriptText(EMOTE_LIGHT_OF_DAWN14, me);
                SetHoldState(true);
                break;
            }
        }

        void EnterEvadeMode() {
            if (!bIsBattle) //do not reset self if we are in battle
                npc_escortAI::EnterEvadeMode();
        }

        void UpdateAI(const uint32 diff) {
            npc_escortAI::UpdateAI(diff);

            if (!bIsBattle) {
                if (uiPhase_timer <= diff) {
                    // ******* Before battle *****************************************************************
                    switch (uiStep) {
                    case 0: // countdown
                        //UpdateWorldState(me->GetMap(), WORLD_STATE_COUNTDOWN, 1);
                        break;

                    case 1: // just delay
                        //UpdateWorldState(me->GetMap(), WORLD_STATE_REMAINS, 1);
                        UpdateWorldState(me->GetMap(), WORLD_STATE_COUNTDOWN,
                                0);
                        UpdateWorldState(me->GetMap(), WORLD_STATE_EVENT_BEGIN,
                                1);
                        me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
                        JumpToNextStep(3000);
                        break;

                    case 2:
                        DoScriptText(SAY_LIGHT_OF_DAWN04, me);
                        if (Creature* pKoltira = GetClosestCreatureWithEntry(me, NPC_KOLTIRA_DEATHWEAVER, 50.0f))
                            uiKoltiraGUID = pKoltira->GetGUID();
                        if (Creature* pOrbaz = GetClosestCreatureWithEntry(me, NPC_ORBAZ_BLOODBANE, 50.0f))
                            uiOrbazGUID = pOrbaz->GetGUID();
                        if (Creature* pThassarian = GetClosestCreatureWithEntry(me, NPC_THASSARIAN, 50.0f))
                            uiThassarianGUID = pThassarian->GetGUID();
                        JumpToNextStep(10000);
                        break;

                    case 3: // rise
                        DoScriptText(SAY_LIGHT_OF_DAWN05, me);
                        JumpToNextStep(3000);
                        break;

                    case 4: // summon ghoul
                        // Dunno whats the summon spell, so workaround
                        DoCast(me, 33271); // shack effect
                        uiPhase_timer = 500;
                        if (uiSummon_counter < ENCOUNTER_GHOUL_NUMBER) {
                            Unit* pTemp = me->SummonCreature(NPC_ACHERUS_GHOUL,
                                    (me->GetPositionX() - 20) + rand() % 40,
                                    (me->GetPositionY() - 20) + rand() % 40,
                                    me->GetPositionZ(), 0,
                                    TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000);
                            pTemp->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);
                            pTemp->setFaction(2084);
                            uiGhoulGUID[uiSummon_counter] = pTemp->GetGUID();
                            ++uiSummon_counter;
                        } else {
                            uiSummon_counter = 0;
                            ++uiStep;
                        }
                        break;

                    case 5: // summon abomination
                        DoCast(me, 33271); // shack effect
                        uiPhase_timer = 500;
                        if (uiSummon_counter < ENCOUNTER_ABOMINATION_NUMBER) {
                            Unit* pTemp = me->SummonCreature(
                                    NPC_RAMPAGING_ABOMINATION,
                                    (me->GetPositionX() - 20) + rand() % 40,
                                    (me->GetPositionY() - 20) + rand() % 40,
                                    me->GetPositionZ(), 0,
                                    TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000);
                            pTemp->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);
                            pTemp->setFaction(2084);
                            uiAbominationGUID[uiSummon_counter] =
                                    pTemp->GetGUID();
                            ++uiSummon_counter;
                        } else {
                            uiSummon_counter = 0;
                            ++uiStep;
                        }
                        break;

                    case 6: // summon warrior
                        DoCast(me, 33271); // shack effect
                        uiPhase_timer = 500;
                        if (uiSummon_counter < ENCOUNTER_WARRIOR_NUMBER) {
                            Unit* pTemp = me->SummonCreature(
                                    NPC_WARRIOR_OF_THE_FROZEN_WASTES,
                                    (me->GetPositionX() - 20) + rand() % 40,
                                    (me->GetPositionY() - 20) + rand() % 40,
                                    me->GetPositionZ(), 0,
                                    TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000);
                            pTemp->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);
                            pTemp->setFaction(2084);
                            uiWarriorGUID[uiSummon_counter] = pTemp->GetGUID();
                            ++uiSummon_counter;
                        } else {
                            uiSummon_counter = 0;
                            ++uiStep;
                        }
                        break;

                    case 7: // summon warrior
                        DoCast(me, 33271); // shack effect
                        uiPhase_timer = 500;
                        if (uiSummon_counter < ENCOUNTER_BEHEMOTH_NUMBER) {
                            Unit* pTemp = me->SummonCreature(NPC_FLESH_BEHEMOTH,
                                    (me->GetPositionX() - 20) + rand() % 40,
                                    (me->GetPositionY() - 20) + rand() % 40,
                                    me->GetPositionZ(), 0,
                                    TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000);
                            pTemp->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);
                            pTemp->setFaction(2084);
                            uiBehemothGUID[uiSummon_counter] = pTemp->GetGUID();
                            ++uiSummon_counter;
                        } else {
                            uiSummon_counter = 0;
                            ++uiStep;
                        }
                        break;

                    case 8: // summon announce
                        DoScriptText(SAY_LIGHT_OF_DAWN06, me);
                        JumpToNextStep(5000);
                        break;

                    case 9: // charge begins
                        SetHoldState(false);
                        if (Creature* pTemp = Unit::GetCreature(*me, uiKoltiraGUID)) {
                            pTemp->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);
                            pTemp->GetMotionMaster()->MovePoint(0,
                                    LightofDawnLoc[0].x + rand() % 30,
                                    LightofDawnLoc[0].y + rand() % 30,
                                    LightofDawnLoc[0].z);
                        }
                        if (Creature* pTemp = Unit::GetCreature(*me, uiOrbazGUID)) {
                            pTemp->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);
                            pTemp->GetMotionMaster()->MovePoint(0,
                                    LightofDawnLoc[0].x + rand() % 30,
                                    LightofDawnLoc[0].y + rand() % 30,
                                    LightofDawnLoc[0].z);
                        }
                        if (Creature* pTemp = Unit::GetCreature(*me, uiThassarianGUID)) {
                            pTemp->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);
                            pTemp->GetMotionMaster()->MovePoint(0,
                                    LightofDawnLoc[0].x + rand() % 30,
                                    LightofDawnLoc[0].y + rand() % 30,
                                    LightofDawnLoc[0].z);
                        }
                        for (uint8 i = 0; i < ENCOUNTER_ABOMINATION_NUMBER; ++i)
                            if (Creature* pTemp = Unit::GetCreature(*me, uiAbominationGUID[i]))
                                pTemp->GetMotionMaster()->MovePoint(0,
                                        LightofDawnLoc[0].x + rand() % 30,
                                        LightofDawnLoc[0].y + rand() % 30,
                                        LightofDawnLoc[0].z);
                        for (uint8 i = 0; i < ENCOUNTER_BEHEMOTH_NUMBER; ++i)
                            if (Creature* pTemp = Unit::GetCreature(*me, uiBehemothGUID[i]))
                                pTemp->GetMotionMaster()->MovePoint(0,
                                        LightofDawnLoc[0].x + rand() % 30,
                                        LightofDawnLoc[0].y + rand() % 30,
                                        LightofDawnLoc[0].z);
                        for (uint8 i = 0; i < ENCOUNTER_GHOUL_NUMBER; ++i)
                            if (Creature* pTemp = Unit::GetCreature(*me, uiGhoulGUID[i]))
                                pTemp->GetMotionMaster()->MovePoint(0,
                                        LightofDawnLoc[0].x + rand() % 30,
                                        LightofDawnLoc[0].y + rand() % 30,
                                        LightofDawnLoc[0].z);
                        for (uint8 i = 0; i < ENCOUNTER_WARRIOR_NUMBER; ++i)
                            if (Creature* pTemp = Unit::GetCreature(*me, uiWarriorGUID[i]))
                                pTemp->GetMotionMaster()->MovePoint(0,
                                        LightofDawnLoc[0].x + rand() % 30,
                                        LightofDawnLoc[0].y + rand() % 30,
                                        LightofDawnLoc[0].z);
                        JumpToNextStep(5000);
                        break;

                        // ******* After battle *****************************************************************
                    case 11: // Tirion starts to speak
                        if (Creature* pTemp = Unit::GetCreature(*me, uiTirionGUID))
                            DoScriptText(SAY_LIGHT_OF_DAWN28, pTemp);
                        JumpToNextStep(21000);
                        break;

                    case 12:
                        if (Creature* pTemp = Unit::GetCreature(*me, uiTirionGUID))
                            DoScriptText(SAY_LIGHT_OF_DAWN29, pTemp);
                        JumpToNextStep(13000);
                        break;

                    case 13:
                        if (Creature* pTemp = Unit::GetCreature(*me, uiTirionGUID))
                            DoScriptText(SAY_LIGHT_OF_DAWN30, pTemp);
                        JumpToNextStep(13000);
                        break;

                    case 14:
                        me->SetStandState(UNIT_STAND_STATE_STAND);
                        DoScriptText(SAY_LIGHT_OF_DAWN31, me);
                        JumpToNextStep(7000);
                        break;

                    case 15: // summon gate
                        if (Unit* pTemp = me->SummonCreature(NPC_HIGHLORD_ALEXANDROS_MOGRAINE, LightofDawnLoc[22].x, LightofDawnLoc[22].y, LightofDawnLoc[22].z, LightofDawnLoc[22].o, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000)) {
                            pTemp->SetFlag(UNIT_FIELD_FLAGS,
                                    UNIT_FLAG_NOT_SELECTABLE);
                            pTemp->CastSpell(pTemp,
                                    SPELL_ALEXANDROS_MOGRAINE_SPAWN, true);
                            DoScriptText(EMOTE_LIGHT_OF_DAWN06, pTemp);
                            uiAlexandrosGUID = pTemp->GetGUID();
                        }
                        JumpToNextStep(4000);
                        break;

                    case 16: // Alexandros out
                        if (Creature* pTemp = Unit::GetCreature(*me, uiAlexandrosGUID)) {
                            pTemp->RemoveFlag(UNIT_FIELD_FLAGS,
                                    UNIT_FLAG_NOT_SELECTABLE);
                            pTemp->GetMotionMaster()->MovePoint(0,
                                    LightofDawnLoc[23].x, LightofDawnLoc[23].y,
                                    LightofDawnLoc[23].z);
                            DoScriptText(SAY_LIGHT_OF_DAWN32, pTemp);
                        }
                        SetHoldState(false); // makes darion turns back
                        JumpToNextStep(5000);
                        break;

                    case 17:
                        me->SetStandState(UNIT_STAND_STATE_KNEEL);
                        DoScriptText(SAY_LIGHT_OF_DAWN34, me);
                        JumpToNextStep(5000);
                        break;

                    case 18: // Darion's spirit out
                        if (Unit* pTemp = me->SummonCreature(NPC_DARION_MOGRAINE, LightofDawnLoc[24].x, LightofDawnLoc[24].y, LightofDawnLoc[24].z, LightofDawnLoc[24].o, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000)) {
                            DoScriptText(SAY_LIGHT_OF_DAWN35, pTemp);
                            pTemp->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);
                            uiDarionGUID = pTemp->GetGUID();
                        }
                        JumpToNextStep(4000);
                        break;

                    case 19: // runs to father
                        if (Creature* pTemp = Unit::GetCreature(*me, uiDarionGUID)) {
                            DoScriptText(EMOTE_LIGHT_OF_DAWN07, pTemp);
                            pTemp->GetMotionMaster()->MovePoint(0,
                                    LightofDawnLoc[25].x, LightofDawnLoc[25].y,
                                    LightofDawnLoc[25].z);
                        }
                        JumpToNextStep(4000);
                        break;

                    case 20:
                        if (Creature* pTemp = Unit::GetCreature(*me, uiDarionGUID))
                            DoScriptText(SAY_LIGHT_OF_DAWN36, pTemp);
                        JumpToNextStep(4000);
                        break;

                    case 21:
                        if (Creature* pTemp = Unit::GetCreature(*me, uiDarionGUID))
                            DoScriptText(EMOTE_LIGHT_OF_DAWN08, pTemp);
                        JumpToNextStep(4000);
                        break;

                    case 22:
                        if (Creature* pTemp = Unit::GetCreature(*me, uiAlexandrosGUID))
                            DoScriptText(SAY_LIGHT_OF_DAWN37, pTemp);
                        JumpToNextStep(8000);
                        break;

                    case 23:
                        if (Creature* pTemp = Unit::GetCreature(*me, uiDarionGUID))
                            DoScriptText(SAY_LIGHT_OF_DAWN38, pTemp);
                        JumpToNextStep(8000);
                        break;

                    case 24:
                        if (Creature* pTemp = Unit::GetCreature(*me, uiAlexandrosGUID))
                            DoScriptText(SAY_LIGHT_OF_DAWN39, pTemp);

                        if (Creature* pTemp = Unit::GetCreature(*me, uiTirionGUID)) // Tirion moves forward here
                            pTemp->GetMotionMaster()->MovePoint(0,
                                    LightofDawnLoc[1].x, LightofDawnLoc[1].y,
                                    LightofDawnLoc[1].z);

                        JumpToNextStep(15000);
                        break;

                    case 25:
                        if (Creature* pTemp = Unit::GetCreature(*me, uiDarionGUID))
                            DoScriptText(SAY_LIGHT_OF_DAWN40, pTemp);
                        JumpToNextStep(11000);
                        break;

                    case 26:
                        if (Creature* pTemp = Unit::GetCreature(*me, uiAlexandrosGUID))
                            DoScriptText(SAY_LIGHT_OF_DAWN41, pTemp);
                        JumpToNextStep(5000);
                        break;

                    case 27:
                        if (Creature* pTemp = Unit::GetCreature(*me, uiDarionGUID))
                            pTemp->setDeathState(JUST_DIED);
                        JumpToNextStep(24000);
                        break;

                    case 28:
                        if (Creature* pTemp = Unit::GetCreature(*me, uiAlexandrosGUID))
                            DoScriptText(SAY_LIGHT_OF_DAWN42, pTemp);
                        JumpToNextStep(6000);
                        break;

                    case 29: // lich king spawns
                        if (Unit* pTemp = me->SummonCreature(NPC_THE_LICH_KING, LightofDawnLoc[26].x, LightofDawnLoc[26].y, LightofDawnLoc[26].z, LightofDawnLoc[26].o, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000)) {
                            DoScriptText(SAY_LIGHT_OF_DAWN43, pTemp);
                            uiLichKingGUID = pTemp->GetGUID();
                            if (Unit* pAlex = Unit::GetCreature(*me, uiAlexandrosGUID))
                                pTemp->CastSpell(pAlex, SPELL_SOUL_FEAST_ALEX,
                                        false);
                        }
                        JumpToNextStep(2000);
                        break;

                    case 30:
                        if (Creature* pTemp = Unit::GetCreature(*me, uiAlexandrosGUID)) // just hide him
                        {
                            DoScriptText(EMOTE_LIGHT_OF_DAWN09, pTemp);
                            pTemp->SetVisible(false);
                        }
                        if (Creature* pTemp = Unit::GetCreature(*me, uiLichKingGUID)) {
                            pTemp->InterruptNonMeleeSpells(false);
                            DoScriptText(SAY_LIGHT_OF_DAWN45, pTemp);
                        }
                        JumpToNextStep(3000);
                        break;

                    case 31:
                        me->SetStandState(UNIT_STAND_STATE_STAND);
                        DoScriptText(EMOTE_LIGHT_OF_DAWN10, me);
                        DoScriptText(SAY_LIGHT_OF_DAWN44, me);
                        JumpToNextStep(3000);
                        break;

                    case 32:
                        if (Creature* pTemp = Unit::GetCreature(*me, uiLichKingGUID))
                            pTemp->GetMotionMaster()->MovePoint(0,
                                    LightofDawnLoc[27].x, LightofDawnLoc[27].y,
                                    LightofDawnLoc[27].z);
                        JumpToNextStep(6000);
                        break;

                    case 33: // Darion supports to jump to lich king here
                        if (Unit::GetCreature(*me, uiLichKingGUID))
                            DoCast(me, SPELL_MOGRAINE_CHARGE); // jumping charge
                        //   doesn't make it looks well, so workarounds, Darion charges, looks better
                        me->SetSpeed(MOVE_RUN, 3.0f);
                        me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);
                        SetHoldState(false);
                        JumpToNextStep(0);
                        break;

                    case 35: // Lich king counterattacks
                        if (Creature* pTemp = Unit::GetCreature(*me, uiLichKingGUID)) {
                            pTemp->HandleEmoteCommand(EMOTE_ONESHOT_KICK);
                            DoScriptText(SAY_LIGHT_OF_DAWN46, pTemp);
                        }
                        me->SetSpeed(MOVE_RUN, 6.0f);
                        me->SetStandState(UNIT_STAND_STATE_DEAD);
                        SetHoldState(false); // Darion got kicked by lich king
                        JumpToNextStep(0);
                        break;

                    case 37: // Lich king counterattacks
                        me->SetStandState(UNIT_STAND_STATE_KNEEL);
                        JumpToNextStep(3000);
                        break;

                    case 38:
                        if (Creature* pTemp = Unit::GetCreature(*me, uiTirionGUID))
                            DoScriptText(SAY_LIGHT_OF_DAWN47, pTemp);
                        JumpToNextStep(8000);
                        break;

                    case 39:
                        if (Creature* pTemp = Unit::GetCreature(*me, uiLichKingGUID))
                            DoScriptText(SAY_LIGHT_OF_DAWN48, pTemp);
                        JumpToNextStep(15000);
                        break;

                    case 40:
                        if (Creature* pTemp = Unit::GetCreature(*me, uiLichKingGUID))
                            DoScriptText(SAY_LIGHT_OF_DAWN49, pTemp);
                        JumpToNextStep(17000);
                        break;

                    case 41: // Lich king - Apocalypse
                        if (Creature* pTemp = Unit::GetCreature(*me, uiLichKingGUID)) {
                            DoScriptText(EMOTE_LIGHT_OF_DAWN11, pTemp);
                            DoScriptText(SAY_LIGHT_OF_DAWN51, pTemp);
                            if (Unit* pTirion = Unit::GetCreature(*me, uiTirionGUID)) {
                                pTirion->SetStandState(UNIT_STAND_STATE_KNEEL);
                                //pTemp->CastSpell(pTirion, SPELL_APOCALYPSE, false); // not working
                                pTemp->CastSpell(pTirion,
                                        SPELL_SOUL_FEAST_TIRION, false);
                                DoScriptText(EMOTE_LIGHT_OF_DAWN12, pTirion);
                            }
                        }
                        JumpToNextStep(2000);
                        break;

                    case 42: // Maxwell yells for attack
                    {
                        float fLichPositionX = 0, fLichPositionY = 0,
                                fLichPositionZ = 0;
                        if (Creature* pTemp = Unit::GetCreature(*me, uiLichKingGUID)) {
                            fLichPositionX = pTemp->GetPositionX();
                            fLichPositionY = pTemp->GetPositionY();
                            fLichPositionZ = pTemp->GetPositionZ();
                        }

                        if (fLichPositionX && fLichPositionY) {
                            Unit* pTemp;
                            pTemp = me->SummonCreature(
                                    NPC_DEFENDER_OF_THE_LIGHT,
                                    LightofDawnLoc[0].x + rand() % 10,
                                    LightofDawnLoc[0].y + rand() % 10,
                                    LightofDawnLoc[0].z, 0,
                                    TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10000);
                            pTemp->SetUInt32Value(UNIT_NPC_EMOTESTATE,
                                    EMOTE_STATE_ATTACK_UNARMED);
                            pTemp->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);
                            pTemp->SetSpeed(MOVE_RUN, 2.0f);
                            pTemp->setFaction(me->getFaction());
                            pTemp->GetMotionMaster()->MovePoint(0,
                                    fLichPositionX, fLichPositionY,
                                    fLichPositionZ);
                            uiDefenderGUID[0] = pTemp->GetGUID();

                            pTemp = me->SummonCreature(NPC_RIMBLAT_EARTHSHATTER,
                                    LightofDawnLoc[0].x + rand() % 10,
                                    LightofDawnLoc[0].y + rand() % 10,
                                    LightofDawnLoc[0].z, 0,
                                    TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10000);
                            pTemp->SetUInt32Value(UNIT_NPC_EMOTESTATE,
                                    EMOTE_STATE_ATTACK_UNARMED);
                            pTemp->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);
                            pTemp->SetSpeed(MOVE_RUN, 2.0f);
                            pTemp->setFaction(me->getFaction());
                            pTemp->GetMotionMaster()->MovePoint(0,
                                    fLichPositionX, fLichPositionY,
                                    fLichPositionZ);
                            uiEarthshatterGUID[0] = pTemp->GetGUID();
                        }
                        if (Creature* pTemp = Unit::GetCreature(*me, uiMaxwellGUID)) {
                            pTemp->SetUInt32Value(UNIT_NPC_EMOTESTATE,
                                    EMOTE_STATE_ATTACK_UNARMED);
                            pTemp->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);
                            pTemp->SetSpeed(MOVE_RUN, 2.0f);
                            pTemp->GetMotionMaster()->MovePoint(0,
                                    fLichPositionX, fLichPositionY,
                                    fLichPositionZ);
                            DoScriptText(SAY_LIGHT_OF_DAWN50, pTemp);
                        }
                        if (Creature* pTemp = Unit::GetCreature(*me, uiKorfaxGUID)) {
                            pTemp->SetUInt32Value(UNIT_NPC_EMOTESTATE,
                                    EMOTE_STATE_ATTACK_UNARMED);
                            pTemp->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);
                            pTemp->SetSpeed(MOVE_RUN, 2.0f);
                            pTemp->HandleEmoteCommand(
                                    EMOTE_STATE_ATTACK_UNARMED);
                            pTemp->GetMotionMaster()->MovePoint(0,
                                    fLichPositionX, fLichPositionY,
                                    fLichPositionZ);
                        }
                        if (Creature* pTemp = Unit::GetCreature(*me, uiEligorGUID)) {
                            pTemp->SetUInt32Value(UNIT_NPC_EMOTESTATE,
                                    EMOTE_STATE_ATTACK_UNARMED);
                            pTemp->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);
                            pTemp->SetSpeed(MOVE_RUN, 2.0f);
                            pTemp->GetMotionMaster()->MovePoint(0,
                                    fLichPositionX, fLichPositionY,
                                    fLichPositionZ);
                        }
                    }
                        JumpToNextStep(4500);
                        break;

                    case 43: // They all got kicked
                        if (Creature* pTemp = Unit::GetCreature(*me, uiLichKingGUID))
                            DoScriptText(EMOTE_LIGHT_OF_DAWN13, pTemp);

                        if (Creature* pTemp = Unit::GetCreature(*me, uiMaxwellGUID)) {
                            pTemp->SetUInt32Value(UNIT_NPC_EMOTESTATE,
                                    EMOTE_ONESHOT_NONE);
                            pTemp->SetSpeed(MOVE_RUN, 6.0f);
                            pTemp->SetStandState(UNIT_STAND_STATE_DEAD);
                            pTemp->GetMotionMaster()->MovePoint(0,
                                    LightofDawnLoc[14].x, LightofDawnLoc[14].y,
                                    LightofDawnLoc[14].z);
                        }
                        if (Creature* pTemp = Unit::GetCreature(*me, uiKorfaxGUID)) {
                            pTemp->SetUInt32Value(UNIT_NPC_EMOTESTATE,
                                    EMOTE_ONESHOT_NONE);
                            pTemp->SetSpeed(MOVE_RUN, 6.0f);
                            pTemp->SetStandState(UNIT_STAND_STATE_DEAD);
                            pTemp->GetMotionMaster()->MovePoint(0,
                                    LightofDawnLoc[11].x, LightofDawnLoc[11].y,
                                    LightofDawnLoc[11].z);
                        }
                        if (Creature* pTemp = Unit::GetCreature(*me, uiEligorGUID)) {
                            pTemp->SetUInt32Value(UNIT_NPC_EMOTESTATE,
                                    EMOTE_ONESHOT_NONE);
                            pTemp->SetSpeed(MOVE_RUN, 6.0f);
                            pTemp->SetStandState(UNIT_STAND_STATE_DEAD);
                            pTemp->GetMotionMaster()->MovePoint(0,
                                    LightofDawnLoc[17].x, LightofDawnLoc[17].y,
                                    LightofDawnLoc[17].z);
                        }
                        if (Creature* pTemp = Unit::GetCreature(*me, uiDefenderGUID[0])) {
                            pTemp->SetSpeed(MOVE_RUN, 6.0f);
                            pTemp->SetStandState(UNIT_STAND_STATE_DEAD);
                            pTemp->GetMotionMaster()->MovePoint(0,
                                    LightofDawnLoc[0].x + rand() % 10,
                                    LightofDawnLoc[0].y + rand() % 10,
                                    LightofDawnLoc[0].z);
                        }
                        if (Creature* pTemp = Unit::GetCreature(*me, uiEarthshatterGUID[0])) {
                            pTemp->SetSpeed(MOVE_RUN, 6.0f);
                            pTemp->SetStandState(UNIT_STAND_STATE_DEAD);
                            pTemp->GetMotionMaster()->MovePoint(0,
                                    LightofDawnLoc[0].x + rand() % 10,
                                    LightofDawnLoc[0].y + rand() % 10,
                                    LightofDawnLoc[0].z);
                        }
                        JumpToNextStep(3000);
                        break;

                    case 44: // make them stand up
                        if (Creature* pTemp = Unit::GetCreature(*me, uiMaxwellGUID))
                            pTemp->SetStandState(UNIT_STAND_STATE_STAND);
                        if (Creature* pTemp = Unit::GetCreature(*me, uiKorfaxGUID))
                            pTemp->SetStandState(UNIT_STAND_STATE_STAND);
                        if (Creature* pTemp = Unit::GetCreature(*me, uiEligorGUID))
                            pTemp->SetStandState(UNIT_STAND_STATE_STAND);
                        JumpToNextStep(1000);
                        break;

                    case 45:
                        DoScriptText(SAY_LIGHT_OF_DAWN52, me);
                        JumpToNextStep(5000);
                        break;

                    case 46: // Darion stand up, "not today"
                        me->SetSpeed(MOVE_RUN, 1.0f);
                        me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING);
                        me->SetStandState(UNIT_STAND_STATE_STAND);
                        DoScriptText(SAY_LIGHT_OF_DAWN53, me);
                        SetHoldState(false); // Darion throws sword
                        JumpToNextStep(7000);
                        break;

                    case 47: // Ashbringer rebirth
                        me->SetStandState(UNIT_STAND_STATE_KNEEL);
                        DoScriptText(EMOTE_LIGHT_OF_DAWN15, me);
                        if (Creature* pTemp = Unit::GetCreature(*me, uiTirionGUID)) {
                            pTemp->SetStandState(UNIT_STAND_STATE_STAND);
                            pTemp->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0,
                                    uint32(EQUIP_HIGHLORD_TIRION_FORDRING));
                            pTemp->CastSpell(pTemp,
                                    SPELL_REBIRTH_OF_THE_ASHBRINGER, false);
                        }
                        JumpToNextStep(1000);
                        break;

                    case 48: // Show the cleansing effect (dawn of light)
                        //if (GameObject* pGo = me->GetMap()->GetGameObject(uiDawnofLightGUID))
                        //    pGo->SetPhaseMask(128, true);
                        me->SummonGameObject(GO_LIGHT_OF_DAWN, 2283.896f,
                                -5287.914f, 83.066f, 0, 0, 0, 0, 0, 30000);
                        if (Creature* pTemp = Unit::GetCreature(*me, uiTirionGUID)) {
                            if (pTemp->HasAura(SPELL_REBIRTH_OF_THE_ASHBRINGER,
                                    0))
                                pTemp->RemoveAurasDueToSpell(
                                        SPELL_REBIRTH_OF_THE_ASHBRINGER);
                            pTemp->CastSpell(pTemp, 41542, false); // workarounds, light expoded, makes it cool
                            pTemp->HandleEmoteCommand(EMOTE_ONESHOT_ROAR);
                        }
                        if (Creature* pTemp = Unit::GetCreature(*me, uiLichKingGUID))
                            pTemp->InterruptNonMeleeSpells(false);
                        JumpToNextStep(2500);
                        break;

                    case 49:
                        if (Creature* pTemp = Unit::GetCreature(*me, uiTirionGUID))
                            DoScriptText(SAY_LIGHT_OF_DAWN54, pTemp);
                        JumpToNextStep(4000);
                        break;

                    case 50:
                        if (Creature* pTemp = Unit::GetCreature(*me, uiLichKingGUID))
                            DoScriptText(SAY_LIGHT_OF_DAWN55, pTemp);
                        JumpToNextStep(5000);
                        break;

                    case 51:
                        if (Creature* pTemp = Unit::GetCreature(*me, uiTirionGUID))
                            DoScriptText(SAY_LIGHT_OF_DAWN56, pTemp);
                        JumpToNextStep(1000);
                        break;

                    case 52: // Tiron charges
                        if (Creature* pTemp = Unit::GetCreature(*me, uiTirionGUID)) {
                            DoScriptText(EMOTE_LIGHT_OF_DAWN16, pTemp);
                            pTemp->CastSpell(pTemp, SPELL_TIRION_CHARGE, false); // jumping charge
                            pTemp->SetUInt32Value(UNIT_NPC_EMOTESTATE,
                                    EMOTE_STATE_READY2H);
                            pTemp->SetSpeed(MOVE_RUN, 3.0f); // workarounds, make Tirion still running
                            pTemp->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);
                            pTemp->GetMotionMaster()->MovePoint(0,
                                    LightofDawnLoc[2].x, LightofDawnLoc[2].y,
                                    LightofDawnLoc[2].z);
                            if (Creature* pTemp = Unit::GetCreature(*me, uiLichKingGUID))
                                pTemp->Relocate(LightofDawnLoc[28].x,
                                        LightofDawnLoc[28].y,
                                        LightofDawnLoc[28].z); // workarounds, he should kick back by Tirion, but here we relocate him
                        }
                        JumpToNextStep(1500);
                        break;

                    case 53:
                        if (Creature* pTemp = Unit::GetCreature(*me, uiLichKingGUID))
                            DoScriptText(SAY_LIGHT_OF_DAWN57, pTemp);
                        JumpToNextStep(1000);
                        break;

                    case 54:
                        if (Creature* pTemp = Unit::GetCreature(*me, uiLichKingGUID)) {
                            pTemp->SetSpeed(MOVE_RUN, 1.0f);
                            me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING);
                            pTemp->GetMotionMaster()->MovePoint(0,
                                    LightofDawnLoc[29].x, LightofDawnLoc[29].y,
                                    LightofDawnLoc[29].z); // 26
                        }
                        JumpToNextStep(4000);
                        break;

                    case 55:
                        if (Creature* pTemp = Unit::GetCreature(*me, uiLichKingGUID))
                            pTemp->SetStandState(UNIT_STAND_STATE_KNEEL);
                        JumpToNextStep(2000);
                        break;

                    case 56:
                        if (Creature* pTemp = Unit::GetCreature(*me, uiLichKingGUID))
                            pTemp->SetStandState(UNIT_STAND_STATE_STAND);
                        JumpToNextStep(1500);
                        break;

                    case 57:
                        if (Creature* pTemp = Unit::GetCreature(*me, uiLichKingGUID))
                            DoScriptText(SAY_LIGHT_OF_DAWN58, pTemp);
                        JumpToNextStep(10000);
                        break;

                    case 58:
                        if (Creature* pTemp = Unit::GetCreature(*me, uiLichKingGUID))
                            DoScriptText(SAY_LIGHT_OF_DAWN59, pTemp);
                        JumpToNextStep(10000);
                        break;

                    case 59:
                        if (Creature* pTemp = Unit::GetCreature(*me, uiLichKingGUID))
                            pTemp->CastSpell(pTemp, SPELL_TELEPORT_VISUAL,
                                    false);
                        if (Creature* pTemp = Unit::GetCreature(*me, uiTirionGUID)) // Tirion runs to Darion
                        {
                            pTemp->SetUInt32Value(UNIT_NPC_EMOTESTATE,
                                    EMOTE_ONESHOT_NONE);
                            pTemp->SetSpeed(MOVE_RUN, 1.0f);
                            pTemp->GetMotionMaster()->MovePoint(0,
                                    LightofDawnLoc[6].x, LightofDawnLoc[6].y,
                                    LightofDawnLoc[6].z);
                        }
                        JumpToNextStep(2500);
                        break;

                    case 60:
                        if (Creature* pTemp = Unit::GetCreature(*me, uiLichKingGUID)) // Lich king disappears here
                        {
                            DoScriptText(EMOTE_LIGHT_OF_DAWN17, pTemp);
                            pTemp->Kill(pTemp);
                        }
                        JumpToNextStep(10000);
                        break;

                    case 61:
                        if (Creature* pTemp = Unit::GetCreature(*me, uiTirionGUID))
                            DoScriptText(SAY_LIGHT_OF_DAWN60, pTemp);
                        JumpToNextStep(3000);
                        break;

                    case 62:
                        if (Creature* pTemp = Unit::GetCreature(*me, uiTirionGUID)) {
                            pTemp->AddUnitMovementFlag(MOVEMENTFLAG_WALKING);
                            pTemp->GetMotionMaster()->MovePoint(0,
                                    LightofDawnLoc[7].x, LightofDawnLoc[7].y,
                                    LightofDawnLoc[7].z);
                        }
                        JumpToNextStep(5500);
                        break;

                    case 63:
                        if (Creature* pTemp = Unit::GetCreature(*me, uiTirionGUID)) {
                            pTemp->GetMotionMaster()->MovePoint(0,
                                    LightofDawnLoc[8].x, LightofDawnLoc[8].y,
                                    LightofDawnLoc[8].z);
                            DoScriptText(SAY_LIGHT_OF_DAWN61, pTemp);
                        }
                        JumpToNextStep(15000);
                        break;

                    case 64:
                        if (Creature* pTemp = Unit::GetCreature(*me, uiTirionGUID))
                            DoScriptText(SAY_LIGHT_OF_DAWN62, pTemp);
                        JumpToNextStep(7000);
                        break;

                    case 65:
                        if (Creature* pTemp = Unit::GetCreature(*me, uiTirionGUID))
                            DoScriptText(SAY_LIGHT_OF_DAWN63, pTemp);
                        JumpToNextStep(10000);
                        break;

                    case 66:
                        if (Creature* pTemp = Unit::GetCreature(*me, uiTirionGUID))
                            DoScriptText(SAY_LIGHT_OF_DAWN64, pTemp);
                        JumpToNextStep(11000);
                        break;

                    case 67:
                        if (Creature* pTemp = Unit::GetCreature(*me, uiTirionGUID))
                            DoScriptText(SAY_LIGHT_OF_DAWN65, pTemp);
                        JumpToNextStep(10000);
                        break;

                    case 68:
                        if (Creature* pTemp = Unit::GetCreature(*me, uiTirionGUID))
                            DoScriptText(SAY_LIGHT_OF_DAWN66, pTemp);
                        JumpToNextStep(8000);
                        break;

                    case 69:
                        if (Creature* pTemp = Unit::GetCreature(*me, uiTirionGUID))
                            DoScriptText(SAY_LIGHT_OF_DAWN67, pTemp);
                        JumpToNextStep(10000);
                        break;

                    case 70:
                        me->SetStandState(UNIT_STAND_STATE_STAND);
                        DoScriptText(SAY_LIGHT_OF_DAWN68, me);
                        JumpToNextStep(10000);
                        break;

                    case 71:
                        //if (GameObject* pGo = me->GetMap()->GetGameObject(uiDawnofLightGUID)) // Turn off dawn of light
                        //    pGo->SetPhaseMask(0, true);

                    {
                        Map *map = me->GetMap(); // search players with in 50 yards for quest credit
                        Map::PlayerList const &PlayerList = map->GetPlayers();
                        if (!PlayerList.isEmpty()) {
                            for (Map::PlayerList::const_iterator i =
                                    PlayerList.begin(); i != PlayerList.end();
                                    ++i)
                                if (i->getSource()->isAlive()
                                        && me->IsWithinDistInMap(i->getSource(),
                                                50))
                                    i->getSource()->CastSpell(i->getSource(),
                                            SPELL_THE_LIGHT_OF_DAWN_Q, false);
                        }
                    }
                        me->SetVisible(false); // respawns another Darion for quest turn in
                        me->SummonCreature(NPC_HIGHLORD_DARION_MOGRAINE,
                                me->GetPositionX(), me->GetPositionY(),
                                me->GetPositionZ(), 0,
                                TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 180000);
                        JumpToNextStep(1000);
                        break;

                    case 72:
                        SetHoldState(false); // Escort ends
                        JumpToNextStep(25000);
                        break;

                    case 73:
                        if (Creature* pTemp = Unit::GetCreature(*me, uiKoltiraGUID))
                            pTemp->DespawnOrUnsummon();
                        if (Creature* pTemp = Unit::GetCreature(*me, uiOrbazGUID))
                            pTemp->DespawnOrUnsummon();
                        if (Creature* pTemp = Unit::GetCreature(*me, uiThassarianGUID))
                            pTemp->DespawnOrUnsummon();
                        if (Creature* pTemp = Unit::GetCreature(*me, uiLichKingGUID))
                            pTemp->DespawnOrUnsummon();
                        me->ForcedDespawn();
                        break;
                    }
                } else
                    uiPhase_timer -= diff;
            }

            // ******* During battle *****************************************************************
            else {
                if (uiAnti_magic_zone <= diff) {
                    DoCast(me, SPELL_ANTI_MAGIC_ZONE1);
                    uiAnti_magic_zone = 25000 + rand() % 5000;
                } else
                    uiAnti_magic_zone -= diff;

                if (uiDeath_strike <= diff) {
                    DoCast(me->getVictim(), SPELL_DEATH_STRIKE);
                    uiDeath_strike = 5000 + rand() % 5000;
                } else
                    uiDeath_strike -= diff;

                if (uiDeath_embrace <= diff) {
                    DoCast(me->getVictim(), SPELL_DEATH_EMBRACE);
                    uiDeath_embrace = 5000 + rand() % 5000;
                } else
                    uiDeath_embrace -= diff;

                if (uiIcy_touch <= diff) {
                    DoCast(me->getVictim(), SPELL_ICY_TOUCH1);
                    uiIcy_touch = 5000 + rand() % 5000;
                } else
                    uiIcy_touch -= diff;

                if (uiUnholy_blight <= diff) {
                    DoCast(me->getVictim(), SPELL_UNHOLY_BLIGHT);
                    uiUnholy_blight = 5000 + rand() % 5000;
                } else
                    uiUnholy_blight -= diff;

                if (uiFight_speech <= diff) {
                    DoScriptText(
                            RAND(SAY_LIGHT_OF_DAWN09, SAY_LIGHT_OF_DAWN10,
                                    SAY_LIGHT_OF_DAWN11, SAY_LIGHT_OF_DAWN12,
                                    SAY_LIGHT_OF_DAWN13, SAY_LIGHT_OF_DAWN14,
                                    SAY_LIGHT_OF_DAWN15, SAY_LIGHT_OF_DAWN16,
                                    SAY_LIGHT_OF_DAWN17, SAY_LIGHT_OF_DAWN18,
                                    SAY_LIGHT_OF_DAWN19, SAY_LIGHT_OF_DAWN20,
                                    SAY_LIGHT_OF_DAWN21, SAY_LIGHT_OF_DAWN22,
                                    SAY_LIGHT_OF_DAWN23, SAY_LIGHT_OF_DAWN24),
                            me);
                    uiFight_speech = 15000 + rand() % 5000;
                } else
                    uiFight_speech -= diff;

                // Check spawns
                if (uiSpawncheck <= diff) {
                    SpawnNPC();
                    uiSpawncheck = 1000;
                } else
                    uiSpawncheck -= diff;

                // Check targets
                if (uiTargetcheck <= diff) {
                    for (uint8 i = 0; i < ENCOUNTER_GHOUL_NUMBER; ++i)
                        NPCChangeTarget(uiGhoulGUID[i]);
                    for (uint8 i = 0; i < ENCOUNTER_WARRIOR_NUMBER; ++i)
                        NPCChangeTarget(uiWarriorGUID[i]);
                    for (uint8 i = 0; i < ENCOUNTER_ABOMINATION_NUMBER; ++i)
                        NPCChangeTarget(uiAbominationGUID[i]);
                    for (uint8 i = 0; i < ENCOUNTER_BEHEMOTH_NUMBER; ++i)
                        NPCChangeTarget(uiBehemothGUID[i]);
                    NPCChangeTarget(uiKoltiraGUID);
                    NPCChangeTarget(uiOrbazGUID);
                    NPCChangeTarget(uiThassarianGUID);

                    uiTargetcheck = 10000;
                } else
                    uiTargetcheck -= diff;

                // Battle end
                if (uiFight_duration <= diff + 5000) {
                    if (!uiTirionGUID)
                        if (Unit* pTemp = me->SummonCreature(NPC_HIGHLORD_TIRION_FORDRING, LightofDawnLoc[0].x, LightofDawnLoc[0].y, LightofDawnLoc[0].z, 1.528f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 600000)) {
                            pTemp->setFaction(me->getFaction());
                            pTemp->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0,
                                    uint32(EQUIP_UNEQUIP));
                            DoScriptText(SAY_LIGHT_OF_DAWN25, pTemp);
                            uiTirionGUID = pTemp->GetGUID();
                        }
                }
                if (uiFight_duration <= diff) {
                    bIsBattle = false;
                    uiFight_duration = 300000;

                    if (me->HasAura(SPELL_THE_MIGHT_OF_MOGRAINE, 0))
                        me->RemoveAurasDueToSpell(SPELL_THE_MIGHT_OF_MOGRAINE);
                    me->RemoveAllAuras();
                    me->DeleteThreatList();
                    me->CombatStop(true);
                    me->InterruptNonMeleeSpells(false);
                    me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);

                    for (uint8 i = 0; i < ENCOUNTER_DEFENDER_NUMBER; ++i)
                        DespawnNPC(uiDefenderGUID[i]);
                    for (uint8 i = 0; i < ENCOUNTER_EARTHSHATTER_NUMBER; ++i)
                        DespawnNPC(uiEarthshatterGUID[i]);
                    for (uint8 i = 0; i < ENCOUNTER_ABOMINATION_NUMBER; ++i)
                        DespawnNPC(uiAbominationGUID[i]);
                    for (uint8 i = 0; i < ENCOUNTER_BEHEMOTH_NUMBER; ++i)
                        DespawnNPC(uiBehemothGUID[i]);
                    for (uint8 i = 0; i < ENCOUNTER_GHOUL_NUMBER; ++i)
                        DespawnNPC(uiGhoulGUID[i]);
                    for (uint8 i = 0; i < ENCOUNTER_WARRIOR_NUMBER; ++i)
                        DespawnNPC(uiWarriorGUID[i]);

                    if (Creature* pTemp = Unit::GetCreature(*me, uiKorfaxGUID)) {
                        pTemp->RemoveAllAuras();
                        pTemp->DeleteThreatList();
                        pTemp->CombatStop(true);
                        pTemp->AttackStop();
                        pTemp->setFaction(me->getFaction());
                        pTemp->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);
                        pTemp->GetMotionMaster()->MovePoint(0,
                                LightofDawnLoc[9].x, LightofDawnLoc[9].y,
                                LightofDawnLoc[9].z);
                    }

                    if (Creature* pTemp = Unit::GetCreature(*me, uiMaxwellGUID)) {
                        pTemp->RemoveAllAuras();
                        pTemp->DeleteThreatList();
                        pTemp->CombatStop(true);
                        pTemp->AttackStop();
                        pTemp->setFaction(me->getFaction());
                        pTemp->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);
                        pTemp->GetMotionMaster()->MovePoint(0,
                                LightofDawnLoc[12].x, LightofDawnLoc[12].y,
                                LightofDawnLoc[12].z);
                    }

                    if (Creature* pTemp = Unit::GetCreature(*me, uiEligorGUID)) {
                        pTemp->RemoveAllAuras();
                        pTemp->DeleteThreatList();
                        pTemp->CombatStop(true);
                        pTemp->AttackStop();
                        pTemp->setFaction(me->getFaction());
                        pTemp->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);
                        pTemp->GetMotionMaster()->MovePoint(0,
                                LightofDawnLoc[15].x, LightofDawnLoc[15].y,
                                LightofDawnLoc[15].z);
                    }
                    DespawnNPC(uiRayneGUID);

                    if (Creature* pTemp = Unit::GetCreature(*me, uiKoltiraGUID)) {
                        pTemp->RemoveAllAuras();
                        pTemp->DeleteThreatList();
                        pTemp->CombatStop(true);
                        pTemp->AttackStop();
                        pTemp->setFaction(me->getFaction());
                        pTemp->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);
                        pTemp->GetMotionMaster()->MovePoint(0,
                                LightofDawnLoc[18].x, LightofDawnLoc[18].y,
                                LightofDawnLoc[18].z);
                        pTemp->CastSpell(pTemp, SPELL_THE_LIGHT_OF_DAWN, false);
                    }

                    if (Creature* pTemp = Unit::GetCreature(*me, uiOrbazGUID))
                        DoScriptText(EMOTE_LIGHT_OF_DAWN04, pTemp);

                    if (Creature* pTemp = Unit::GetCreature(*me, uiThassarianGUID)) {
                        pTemp->RemoveAllAuras();
                        pTemp->DeleteThreatList();
                        pTemp->CombatStop(true);
                        pTemp->AttackStop();
                        pTemp->setFaction(me->getFaction());
                        pTemp->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);
                        pTemp->GetMotionMaster()->MovePoint(0,
                                LightofDawnLoc[20].x, LightofDawnLoc[20].y,
                                LightofDawnLoc[20].z);
                        pTemp->CastSpell(pTemp, SPELL_THE_LIGHT_OF_DAWN, false);
                    }

                    if (Creature* pTemp = Unit::GetCreature(*me, uiTirionGUID))
                        DoScriptText(SAY_LIGHT_OF_DAWN26, pTemp);

                    SetHoldState(false);
                } else
                    uiFight_duration -= diff;

                DoMeleeAttackIfReady();
            }
        }

        void JumpToNextStep(uint32 uiTimer) {
            uiPhase_timer = uiTimer;
            ++uiStep;
        }

        void NPCChangeTarget(uint64 ui_GUID) {
            if (Creature* pTemp = Unit::GetCreature(*me, ui_GUID))
                if (pTemp->isAlive())
                    if (Unit* pTarger = SelectUnit(SELECT_TARGET_RANDOM, 0))
                        if (pTarger->isAlive()) {
                            // pTemp->DeleteThreatList();
                            pTemp->AddThreat(pTarger, 0.0f);
                            pTemp->AI()->AttackStart(pTarger);
                            pTemp->SetInCombatWith(pTarger);
                            pTarger->SetInCombatWith(pTemp);
                            // pTemp->GetMotionMaster()->MoveChase(pTarger, 20.0f);
                        }
        }

        void SpawnNPC() {
            Unit* pTemp = NULL;

            // Death
            for (uint8 i = 0; i < ENCOUNTER_GHOUL_NUMBER; ++i) {
                pTemp = Unit::GetCreature(*me, uiGhoulGUID[i]);
                if (!pTemp) {
                    pTemp = me->SummonCreature(NPC_ACHERUS_GHOUL,
                            LightofDawnLoc[0].x + rand() % 30,
                            LightofDawnLoc[0].y + rand() % 30,
                            LightofDawnLoc[0].z, 0,
                            TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000);
                    pTemp->setFaction(2084);
                    uiGhoulGUID[i] = pTemp->GetGUID();
                }
            }
            for (uint8 i = 0; i < ENCOUNTER_ABOMINATION_NUMBER; ++i) {
                pTemp = Unit::GetCreature(*me, uiAbominationGUID[i]);
                if (!pTemp) {
                    pTemp = me->SummonCreature(NPC_WARRIOR_OF_THE_FROZEN_WASTES,
                            LightofDawnLoc[0].x + rand() % 30,
                            LightofDawnLoc[0].y + rand() % 30,
                            LightofDawnLoc[0].z, 0,
                            TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000);
                    pTemp->setFaction(2084);
                    uiAbominationGUID[i] = pTemp->GetGUID();
                }
            }
            for (uint8 i = 0; i < ENCOUNTER_WARRIOR_NUMBER; ++i) {
                pTemp = Unit::GetCreature(*me, uiWarriorGUID[i]);
                if (!pTemp) {
                    pTemp = me->SummonCreature(NPC_RAMPAGING_ABOMINATION,
                            LightofDawnLoc[0].x + rand() % 30,
                            LightofDawnLoc[0].y + rand() % 30,
                            LightofDawnLoc[0].z, 0,
                            TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000);
                    pTemp->setFaction(2084);
                    uiWarriorGUID[i] = pTemp->GetGUID();
                }
            }
            for (uint8 i = 0; i < ENCOUNTER_BEHEMOTH_NUMBER; ++i) {
                pTemp = Unit::GetCreature(*me, uiBehemothGUID[i]);
                if (!pTemp) {
                    pTemp = me->SummonCreature(NPC_FLESH_BEHEMOTH,
                            LightofDawnLoc[0].x + rand() % 30,
                            LightofDawnLoc[0].y + rand() % 30,
                            LightofDawnLoc[0].z, 0,
                            TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000);
                    pTemp->setFaction(2084);
                    uiBehemothGUID[i] = pTemp->GetGUID();
                }
            }

            // Dawn
            for (uint8 i = 0; i < ENCOUNTER_DEFENDER_NUMBER; ++i) {
                pTemp = Unit::GetCreature(*me, uiDefenderGUID[i]);
                if (!pTemp) {
                    pTemp = me->SummonCreature(NPC_DEFENDER_OF_THE_LIGHT,
                            LightofDawnLoc[0].x + rand() % 30,
                            LightofDawnLoc[0].y + rand() % 30,
                            LightofDawnLoc[0].z, 0,
                            TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000);
                    pTemp->setFaction(2089);
                    me->AddThreat(pTemp, 0.0f);
                    uiDefenderGUID[i] = pTemp->GetGUID();
                }
            }
            for (uint8 i = 0; i < ENCOUNTER_EARTHSHATTER_NUMBER; ++i) {
                pTemp = Unit::GetCreature(*me, uiEarthshatterGUID[i]);
                if (!pTemp) {
                    pTemp = me->SummonCreature(NPC_RIMBLAT_EARTHSHATTER,
                            LightofDawnLoc[0].x + rand() % 30,
                            LightofDawnLoc[0].y + rand() % 30,
                            LightofDawnLoc[0].z, 0,
                            TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000);
                    pTemp->setFaction(2089);
                    me->AddThreat(pTemp, 0.0f);
                    uiEarthshatterGUID[i] = pTemp->GetGUID();
                }
            }
            pTemp = Unit::GetCreature(*me, uiKorfaxGUID);
            if (!pTemp) {
                pTemp = me->SummonCreature(NPC_KORFAX_CHAMPION_OF_THE_LIGHT,
                        LightofDawnLoc[0].x + rand() % 30,
                        LightofDawnLoc[0].y + rand() % 30, LightofDawnLoc[0].z,
                        0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 600000);
                pTemp->setFaction(2089);
                me->AddThreat(pTemp, 0.0f);
                uiKorfaxGUID = pTemp->GetGUID();
            }
            pTemp = Unit::GetCreature(*me, uiMaxwellGUID);
            if (!pTemp) {
                pTemp = me->SummonCreature(NPC_LORD_MAXWELL_TYROSUS,
                        LightofDawnLoc[0].x + rand() % 30,
                        LightofDawnLoc[0].y + rand() % 30, LightofDawnLoc[0].z,
                        0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 600000);
                pTemp->setFaction(2089);
                me->AddThreat(pTemp, 0.0f);
                uiMaxwellGUID = pTemp->GetGUID();
            }
            pTemp = Unit::GetCreature(*me, uiEligorGUID);
            if (!pTemp) {
                pTemp = me->SummonCreature(NPC_COMMANDER_ELIGOR_DAWNBRINGER,
                        LightofDawnLoc[0].x + rand() % 30,
                        LightofDawnLoc[0].y + rand() % 30, LightofDawnLoc[0].z,
                        0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 600000);
                pTemp->setFaction(2089);
                me->AddThreat(pTemp, 0.0f);
                uiEligorGUID = pTemp->GetGUID();
            }
            pTemp = Unit::GetCreature(*me, uiRayneGUID);
            if (!pTemp) {
                pTemp = me->SummonCreature(NPC_RAYNE,
                        LightofDawnLoc[0].x + rand() % 30,
                        LightofDawnLoc[0].y + rand() % 30, LightofDawnLoc[0].z,
                        0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 300000);
                pTemp->setFaction(2089);
                me->AddThreat(pTemp, 0.0f);
                uiRayneGUID = pTemp->GetGUID();
            }
        }

        void DespawnNPC(uint64 pGUID) {
            if (Creature* pTemp = Unit::GetCreature(*me, pGUID))
                if (pTemp->isAlive()) {
                    pTemp->SetVisible(false);
                    pTemp->Kill(pTemp);
                }
        }
    };
};

/*######
 ## npc the lich king in dawn of light
 ######*/
class npc_the_lich_king_tirion_dawn: public CreatureScript {
public:
    npc_the_lich_king_tirion_dawn() :
            CreatureScript("npc_the_lich_king_tirion_dawn") {
    }

    CreatureAI* GetAI(Creature* pCreature) const {
        return new npc_the_lich_king_tirion_dawnAI(pCreature);
    }

    struct npc_the_lich_king_tirion_dawnAI: public ScriptedAI {
        npc_the_lich_king_tirion_dawnAI(Creature* pCreature) :
                ScriptedAI(pCreature) {
            Reset();
        }
        void Reset() {
        }
        void AttackStart(Unit * /*who*/) {
        } // very sample, just don't make them aggreesive
        void UpdateAI(const uint32 /*diff*/) {
        }
        void JustDied(Unit* /*killer*/) {
        }
    };
};

void AddSC_the_scarlet_enclave_c5() {
    new npc_highlord_darion_mograine();
    new npc_the_lich_king_tirion_dawn();
}
